#include "mainwindow.h"

#include <QDebug>
#include <QApplication>
#include <QHeaderView> // 表头视图
#include <QSqlError> // 数据库错误信息
#include <QSqlRecord> // 用于保存从数据库中检索到的一条记录的类

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 设置主窗体的显示位置与大小 */
    this->setGeometry(0, 0, 800, 480);

    this->setWindowTitle("公众号：Qt历险记    项目：数据库");

    /* 查看本机可用的数据库驱动 */
    QStringList drivers = QSqlDatabase::drivers();
    foreach(QString driver, drivers) {
        qDebug()<<driver;
    }


    /* 以 QSQLITE 驱动方式打开或者创建数据库 */
    sqlDatabase = QSqlDatabase::addDatabase("QSQLITE");
    sqlDatabase.setDatabaseName("employee.db");
    /* 以 open 的方式打开 alarm.db 数据库，则会创建一个 alarm.db */
    if (!sqlDatabase.open())
        qDebug()<<"连接数据库错误"<<sqlDatabase.lastError()<<endl;
    else
        qDebug()<<"连接数据库成功"<<endl;

    // 操作数据库
    QSqlQuery query(sqlDatabase);
    /* 使用指令式创建表 */
    query.exec("create table employee (id int primary key, name vchar(10), age int, sex vchar(3), photo text)");


     QStringList photoPath;
     /* 当前可执行程序的路径 */
     QString path(QApplication::applicationDirPath());
     photoPath<< path + "/photos/1.jpg"<< path + "/photos/2.jpg";

     /* 以指令的方式插入数据，如果数据已经存在则不会成功不能插入 */
     query.exec(tr("insert into employee values(1, '阿三', 27, '男','%1')").arg(photoPath[0]));
     query.exec(tr("insert into employee values(2, '阿四', 28, '男','%1')").arg(photoPath[1]));

     /* QSqlQueryModel 适合用于查询数据，不能修改数据 */
     sqlQueryModel = new QSqlQueryModel(this);

     /* 选择编号，姓名，年龄和性别的内容，显示到 tableView 上，
      * 图片最后通过数据选择再读取 Label 上 */
     sqlQueryModel->setQuery("select id, name, age, sex from employee");

     if (sqlQueryModel->lastError().isValid())
         qDebug()<<"选择数据失败！"<<endl;

     sqlQueryModel->setHeaderData(0, Qt::Horizontal, "编号");
     sqlQueryModel->setHeaderData(1, Qt::Horizontal, "姓名");
     sqlQueryModel->setHeaderData(2, Qt::Horizontal, "年龄");
     sqlQueryModel->setHeaderData(3, Qt::Horizontal, "性别");

     tableView = new QTableView();
     tableView->setModel(sqlQueryModel);

     /* 设置显示平均分列 */
     tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

     mainWidget = new QWidget();
     bottomWidget = new QWidget();
     gridWidget = new QWidget();
     photoWidget = new QWidget();
     imageLabel = new QLabel();

     /* 设置照片属性 */
     imageLabel->setScaledContents(true);
     imageLabel->setMaximumSize(200, 200);

     vBoxLayout = new QVBoxLayout();
     hBoxLayout[0] = new QHBoxLayout();
     hBoxLayout[1] = new QHBoxLayout();
     gridLayout = new QGridLayout();

     for (int i = 0; i < 4; i++)
         label[i] = new QLabel();

     for (int i = 0; i < 2; i++) {
         spinBox[i] = new QSpinBox();
         spinBox[i]->setRange(1, 100);
     }

     comboBox = new QComboBox();
     comboBox->addItem("男");
     comboBox->addItem("女");

     lineEdit = new QLineEdit();

     bottomWidget->setMinimumHeight(this->height() / 2 - 30);
     gridWidget->setMaximumWidth(this->width() / 2 - 30);

     /* 垂直布局 */
     vBoxLayout->addWidget(tableView);
     vBoxLayout->addWidget(bottomWidget);

     mainWidget->setLayout(vBoxLayout);
     setCentralWidget(mainWidget);

     /* 水平布局 */
     hBoxLayout[0]->addWidget(gridWidget);
     hBoxLayout[0]->addWidget(photoWidget);
     bottomWidget->setLayout(hBoxLayout[0]);

     QStringList list;
     list<<"姓名："<<"编号："<<"年龄："<<"性别：";

     /* 网格布局 */
     for (int i = 0; i < 4; i++) {
         gridLayout->addWidget(label[i], i, 0);
         label[i]->setText(list[i]);
         switch (i) {
         case 0:
             gridLayout->addWidget(lineEdit, i, 1);
             break;
         case 1:
             gridLayout->addWidget(spinBox[0], i, 1);
             break;
         case 2:
             gridLayout->addWidget(spinBox[1], i, 1);
             break;
         case 3:
             gridLayout->addWidget(comboBox, i, 1);
             break;
         default:
             break;
         }
     }

     gridWidget->setLayout(gridLayout);
     hBoxLayout[1]->addWidget(imageLabel);
     photoWidget->setLayout(hBoxLayout[1]);

      /* 选择模型 */
     itemSelectionModel = new QItemSelectionModel(sqlQueryModel);
     tableView->setSelectionModel(itemSelectionModel);

     /* 信号槽连接，表示表中行数据变化时，触发槽函数 */
     connect(itemSelectionModel,
             SIGNAL(currentRowChanged(QModelIndex, QModelIndex)),
             this,
             SLOT(on_currentRowChanged(QModelIndex, QModelIndex)));

      /* 数据映射 */
     dataWidgetMapper = new QDataWidgetMapper(this);
     /* 设置为自动提交 */
     dataWidgetMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
     dataWidgetMapper->setModel(sqlQueryModel);
     /* 创建数据映射，将前面的数据库内容映射到控件上 */
     dataWidgetMapper->addMapping(lineEdit, 1);
     dataWidgetMapper->addMapping(spinBox[0], 0);
     dataWidgetMapper->addMapping(spinBox[1], 2);
     dataWidgetMapper->addMapping(comboBox, 3);
}

MainWindow::~MainWindow()
{
    /* 关闭数据库 */
    sqlDatabase.close();
}

void MainWindow::on_currentRowChanged(const QModelIndex &current,
                                      const QModelIndex &previous)
{
    Q_UNUSED(previous)
    /* 更新数据映射行号，初始化时映射到第 0 行 */
    dataWidgetMapper->setCurrentModelIndex(current);
    /* 获取当前行号 */
    int row = itemSelectionModel->currentIndex().row();
    /* 获取当前模型记录 */
    QSqlRecord record = sqlQueryModel->record(row);
    /* 获取 id 信息 */
    int id = record.value("id").toInt();
    QSqlQuery query;
    /* 使用 bindValue 绑定 prepare 里语句的值，需要使用":"，":"是占位符 */
    query.prepare("select photo from employee where id = :ID");
    query.bindValue(":ID", id);
    query.exec();
    /* 返回到选择的第一条记录，因为 id 是唯一的，也只有一条记录 */
    query.first();

    /* 获取字段为 photo 的值，也就是存储照片的路径 */
    QVariant temp = query.value("photo");
    if (!temp.isValid()) {
        qDebug()<<"数据无效！"<<endl;
        return;
    }

    /* 清空图片显示 */
    imageLabel->clear();

    QImage image(temp.toString());

    if (image.isNull()) {
        qDebug()<<"未找到"<<temp.toString()<<endl;
        return;
    }

    /* 显示照片 */
    imageLabel->setPixmap(QPixmap::fromImage(image));
}













